package com.konsung.ksdc.common.utils;

import com.konsung.ksdc.bean.netbean.ReplyNetBean;
import com.konsung.ksdc.config.NetConfig;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

/**
 * 日期时间相关工具 日期格式 日期计算
 */
public class DateUtils {

    public static int yyyyMmDd = 1;

    public static int yyyyMD = 2;

    public static int yyMmDd = 3;

    public static int yyMD = 4;

    public static int yyyyMmDdHhMmSs = 5;

    public static int yyyyMDHMS = 6;

    public static int yyMmDdHhMmSs = 7;

    public static int yyMDHMS = 8;

    public static int yyyy = 9;

    public static int yyyyMm = 10;

    public static int yyyyMMdd = 11;

    public static int yyyyMM = 12;

    public static int yyyyMMddHHmmss = 13;

    public static int yyMMddHH = 14;

    // 2010-01-01T00:00:00.0Z
    public static int yyyyMmDdTHhMmSs0Z = 15;

    public static int hhMmSs = 16;

    public static int hhMm = 17;

    /**
     * 输入Date类型的日期与格式代号，以String类型返回需要的格式
     * @param calendar Date 类型的日期
     * @param i 格式类型 可以这样调用DateTool.yyyy_MM_dd
     * @return String类型返回需要的格式
     */

    public static String getStringDateFormat(Date calendar, int i) {
        SimpleDateFormat simpledateformat = new SimpleDateFormat();
        switch (i) {
            case 1: // '\001'
                simpledateformat.applyPattern("yyyy-MM-dd");
                break;

            case 2: // '\002'
                simpledateformat.applyPattern("yyyy-M-d");
                break;

            case 3: // '\003'
                simpledateformat.applyPattern("yy-MM-dd");
                break;

            case 4: // '\004'
                simpledateformat.applyPattern("yy-M-d");
                break;

            case 5: // '\005'
                simpledateformat.applyPattern("yyyy-MM-dd HH:mm:ss");
                break;

            case 6: // '\006'
                simpledateformat.applyPattern("yyyy-M-d H:m:s");
                break;

            case 7: // '\007'
                simpledateformat.applyPattern("yy-MM-dd HH:mm:ss");
                break;

            case 8: // '\b'
                simpledateformat.applyPattern("yy-M-d H:m:s");
                break;

            case 9: //
                simpledateformat.applyPattern("yyyy");
                break;

            case 10: //
                simpledateformat.applyPattern("yyyy-MM");
                break;

            case 11: //
                simpledateformat.applyPattern("yyyyMMdd");
                break;

            case 12: //
                simpledateformat.applyPattern("yyyyMM");
                break;

            case 13: //
                simpledateformat.applyPattern("yyyyMMddHHmmss");
                break;

            case 14:
                simpledateformat.applyPattern("yyMMddHH");
                break;

            case 15: //
                simpledateformat.applyPattern("yyyy-MM-dd'T'HH:mm:ss.0'Z'");
                break;

            case 16: //
                simpledateformat.applyPattern("HH:mm:ss");
                break;

            case 17:
                simpledateformat.applyPattern("HH:mm");
                break;
            default:
                break;
        }

        return simpledateformat.format(calendar);
    }

    /**
     * 输入String类型的日期与格式代号，以Date类型返回需要的格式
     * @param date String 类型的日期
     * @param i 格式类型 可以这样调用DateTool.yyyy_MM_dd
     * @return 日期
     * @throws Exception 异常
     */
    public static Date getDateFormat(String date, int i) throws Exception {
        SimpleDateFormat simpledateformat = new SimpleDateFormat();
        switch (i) {
            case 1: // '\001'
                simpledateformat.applyPattern("yyyy-MM-dd");
                break;

            case 2: // '\002'
                simpledateformat.applyPattern("yyyy-M-d");
                break;

            case 3: // '\003'
                simpledateformat.applyPattern("yy-MM-dd");
                break;

            case 4: // '\004'
                simpledateformat.applyPattern("yy-M-d");
                break;

            case 5: // '\005'
                simpledateformat.applyPattern("yyyy-MM-dd HH:mm:ss");
                break;

            case 6: // '\006'
                simpledateformat.applyPattern("yyyy-M-d H:m:s");
                break;

            case 7: // '\007'
                simpledateformat.applyPattern("yy-MM-dd HH:mm:ss");
                break;

            case 8: // '\b'
                simpledateformat.applyPattern("yy-M-d H:m:s");
                break;

            case 9: //
                simpledateformat.applyPattern("yyyy");
                break;

            case 10: //
                simpledateformat.applyPattern("yyyy-MM");
                break;

            case 11: //
                simpledateformat.applyPattern("yyyyMMdd");
                break;

            case 12: //
                simpledateformat.applyPattern("yyyyMM");
                break;

            case 13:
                simpledateformat.applyPattern("yyyyMMddHHmmss");
                break;

            case 14:
                simpledateformat.applyPattern("yyMMddHH");
                break;

            case 15: //
                simpledateformat.applyPattern("yyyy-MM-dd'T'HH:mm:ss.0'Z'");
                break;

            case 16: //
                simpledateformat.applyPattern("HH:mm:ss");
                break;
            default:
                break;
        }
        return simpledateformat.parse(date);
    }

    /**
     * 获取log奔溃时间
     * @return 时间
     */
    public static String getDateLog() {
        DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd_HH:mm:ss");
        String date = formatter.format(new Date(System.currentTimeMillis()));
        return date; // 2017-4-03 9:41:31
    }

    /**
     * 取得一天的开始时间
     * @param date 日期
     * @return 第一次日期
     * @throws Exception 异常
     */
    public static Date getFristTimeOfDate(Date date) throws Exception {
        String s = DateUtils.getStringDateFormat(date, DateUtils.yyyyMmDd);
        return DateUtils.getDateFormat(s + " 00:00:00", DateUtils
                .yyyyMmDdHhMmSs);
    }

    /**
     * 取得一天的最后时间
     * @param date 日期
     * @return 最后日期
     * @throws Exception 异常
     */
    public static Date getLastTimeOfDate(Date date) throws Exception {

        GregorianCalendar gc = new GregorianCalendar();
        gc.setTime(date);
        gc.add(GregorianCalendar.DATE, 1);
        return getFristTimeOfDate(gc.getTime());
    }

    /**
     * @param date1 日期1
     * @param date2 日期2
     * @return date1与date2相差的天数 date1 date2
     * @throws Exception 异常
     */
    public static long getDays(String date1, String date2) throws Exception {
        long days = 0;
        Date dt1 = DateUtils.getDateFormat(date1, DateUtils.yyMmDd);
        Date dt2 = DateUtils.getDateFormat(date2, DateUtils.yyMmDd);
        days = dt1.getTime() - dt2.getTime();
        days = days / 1000 / 60 / 60 / 24;
        return days;
    }

    /**
     * 将指定的天数添加到给定的日历字段中。 例: date=2007.12.1 days=2 return 2007.12.3 例:
     * date=2007.12.1 days=-2 return 2007.11.29
     * @param date 指定日期
     * @param days 时间量
     * @return 返回修改后的日期
     */
    public static Date addDays(Date date, int days) {
        GregorianCalendar gc = new GregorianCalendar();
        gc.setTime(date);
        gc.add(Calendar.DAY_OF_MONTH, days);
        return gc.getTime();
    }

    /**
     * 获得小时
     * @return 时
     */
    public static int getMinute() {
        Calendar c = Calendar.getInstance();
        c.setTime(new Date());
        return c.get(Calendar.MINUTE);
    }

    /**
     * 比较时间是昨天还是今天的
     * @param time 时间
     * @return 返回比较后的时间
     */
    public static String compareTime(long time) {
        SimpleDateFormat sdf = new SimpleDateFormat("MM月dd日 HH:mm");
        Calendar calNow = Calendar.getInstance();
        Calendar cal1 = Calendar.getInstance();
        cal1.setTimeInMillis(time);
        if (calNow.get(Calendar.DAY_OF_YEAR) == cal1.get(Calendar.DAY_OF_YEAR)) {
            sdf = new SimpleDateFormat("HH:mm");
        }
        return sdf.format(time);
    }

    /**
     * 通过日期比较排序
     * @param lhs 回复的时间
     * @param rhs 回复的时间
     * @return int值
     */
    public static int compareDateTime(ReplyNetBean lhs, ReplyNetBean rhs) {
        if (lhs.getReplyDate() != null && rhs.getReplyDate() != null) {
            String lhsDate = lhs.getReplyDate().replace("&", " ").replace("_", ":");
            String rhsDate = rhs.getReplyDate().replace("&", " ").replace("_", ":");
            DateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
            try {
                Date dt1 = df.parse(lhsDate);
                Date dt2 = df.parse(rhsDate);
                if (dt1.getTime() > dt2.getTime()) {
                    return 1;
                } else if (dt1.getTime() < dt2.getTime()) {

                    return -1;
                } else {
                    return 0;
                }
            } catch (Exception exception) {
                exception.printStackTrace();
            }
        }

        return 0;
    }

    /**
     * 比较消息与用户注册时间
     * @param msgTime 消息发送时间
     * @return true 不推送 false 推送
     */
    public static boolean compareMsgTime(Long msgTime) {
        Long registerTime = Long.parseLong(NetConfig.currentUser.getRegisterTime());
        if (msgTime < registerTime) {
            //如果推送消息早于用户注册时间。不推送
            return true;
        }
        return false;
    }

    /**
     * 转换时间日期格式字串为long型
     * @param time 格式为：yyyy-MM-dd HH:mm:ss的时间日期类型
     */
    public static Long convertTimeToLong(String time) {
        Date date = null;
        try {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
            date = sdf.parse(time);
            return date.getTime();
        } catch (Exception e) {
            e.printStackTrace();
            return 0L;
        }
    }
}
